class Solution {
    int dx[4] = {0, 0 , -1, 1}; // i点加dx，dy就是i点的上下左右下标
    int dy[4] = {1, -1 , 0, 0};
    bool vis[301][301] = {false}; // 开题目范围大小
    int m, n, ret;

public:
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size(), n = grid[0].size();
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(grid[i][j] == '1' && !vis[i][j])
                {
                    ++ret;
                    dfs(grid, i, j); // 标记周围的1
                }
            }
        }
        return ret;
    }

    void dfs(vector<vector<char>>& grid, int sr, int sc)
    {
        vis[sr][sc] = true;
        for(int i = 0; i < 4; ++i)
        {
            int x = sr + dx[i], y = sc + dy[i];
            if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == '1')
            {
                dfs(grid, x, y);
            }
        }
    }
};